package com.study.hisapi.utils;

import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ContextUtils {

    private static final Logger LOGGER = LoggerFactory.getLogger(ContextUtils.class);
    private static final ThreadLocal<Context> THREAD_LOCAL = ThreadLocal.withInitial(Context::new);

    private ContextUtils() {
    }

    /**
     * 获取当前上下文信息。
     *
     * @return 当前上下文对象
     */
    public static Context getCurrentContext() {
        // 实现获取当前上下文的逻辑
        // 示例：从线程本地存储、请求上下文、会话上下文等位置获取
        Context currentContext = THREAD_LOCAL.get();
        LOGGER.debug("Retrieved current context: {}", currentContext);
        return currentContext;
    }

    /**
     * 设置当前上下文信息。
     *
     * @param context 新的上下文对象
     */
    public static void setCurrentContext(Context context) {
        // 实现设置当前上下文的逻辑
        // 示例：将上下文对象存储到线程本地存储、请求上下文、会话上下文等位置
        LOGGER.debug("Setting current context: {}", context);
        THREAD_LOCAL.set(context);
    }

    /**
     * 清除当前上下文信息。
     */
    public static void clearCurrentContext() {
        // 实现清除当前上下文的逻辑
        // 示例：从线程本地存储、请求上下文、会话上下文等位置移除上下文对象
        LOGGER.debug("Clearing current context");
        THREAD_LOCAL.remove();
    }

    /**
     * 判断当前是否存在有效的上下文信息。
     *
     * @return 如果存在有效上下文，返回 true；否则返回 false
     */
    public static boolean hasCurrentContext() {
        // 实现判断当前是否存在上下文的逻辑
        // 示例：检查线程本地存储、请求上下文、会话上下文等位置是否存在非空上下文对象
        boolean hasContext = THREAD_LOCAL.get() != null;
        LOGGER.debug("Has current context: {}", hasContext);
        return hasContext;
    }

    /**
     * 获取当前上下文的某个属性值。
     *
     * @param attributeName 属性名
     * @return 属性值，如果不存在或无法转换为指定类型，则返回 null
     */
    public static @Nullable Object getAttributeFromCurrentContext(String attributeName) {
        Context currentContext = getCurrentContext();
        if (currentContext == null) {
            return null;
        }
        // 实现从当前上下文中获取属性值的逻辑
        // 示例：调用上下文对象的 getAttribute 方法，转换为指定类型并返回
        Object attributeValue = currentContext.getAttribute(attributeName);
        LOGGER.debug("Retrieved attribute '{}' from current context: {}", attributeName, attributeValue);
        return attributeValue;
    }

    /**
     * 设置当前上下文的某个属性值。
     *
     * @param attributeName  属性名
     * @param attributeValue 属性值
     */
    public static void setAttributeForCurrentContext(String attributeName, Object attributeValue) {
        Context currentContext = getCurrentContext();
        if (currentContext != null) {
            // 实现向当前上下文中设置属性值的逻辑
            // 示例：调用上下文对象的 setAttribute 方法
            currentContext.setAttribute(attributeName, attributeValue);
            LOGGER.debug("Set attribute '{}' in current context to: {}", attributeName, attributeValue);
        } else {
            LOGGER.warn("Cannot set attribute '{}' in current context because it is not available", attributeName);
        }
    }

    /**
     * 删除当前上下文的某个属性。
     *
     * @param attributeName 属性名
     */
    public static void removeAttributeFromCurrentContext(String attributeName) {
        Context currentContext = getCurrentContext();
        if (currentContext != null) {
            // 实现从当前上下文中删除属性的逻辑
            // 示例：调用上下文对象的 removeAttribute 方法
            currentContext.removeAttribute(attributeName);
            LOGGER.debug("Removed attribute '{}' from current context", attributeName);
        } else {
            LOGGER.warn("Cannot remove attribute '{}' from current context because it is not available", attributeName);
        }
    }
}
